Parameters
filtered_data <- read.csv("data/data-2023-09-11 (2).csv", header = TRUE)
selected_stats <- c("Ho", "Hs", "Ht", "Fis (W&C)", "Fst (W&C)", "Fis (Nei)", "Fst (Nei)"
)
n_rep=10
n_pop = 8
sequence_length <- length(6:11)
data filtering convertion
Run basic.stats and render the result
library(pegas)
library(dplyr)
library(tibble)
result <- basic.stats(mydata_hierfstat)
df_resutl_basic<-as.data.frame(result$perloc)
# Weir and Cockrham estimates of Fstatistics - FIS and FST
result_f_stats <- Fst(as.loci(mydata_genind), na.alleles = "")
result_f_stats <- result_f_stats[,2:3]
colnames(result_f_stats) <- c("Fst (W&C)", "Fis (W&C)")
result_f_stats <- merge(result_f_stats, df_resutl_basic, by="row.names",all.x=TRUE)
colnames(result_f_stats)[10] <- "Fst (Nei)"
colnames(result_f_stats)[12] <- "Fis (Nei)"
result_f_stats <- result_f_stats %>% column_to_rownames(., var = 'Row.names')
result_f_stats_selec <- result_f_stats %>% select(all_of(selected_stats))
result_f_stats_selec
G-statistic
library(hrbrthemes)
library(ggplot2)
# compute the Gstats
result_f_stats <- result_f_stats %>% mutate(GST = 1-Hs/Ht)
result_f_stats <- result_f_stats %>% mutate("GST''" = (n_pop*(Ht-Hs))/((n_pop*Hs-Ht)*(1-Hs)))
result_f_stats
# Plot with linear trend
p2 <- ggplot(result_f_stats, aes(x=GST, y=Hs)) +
geom_point() +
geom_smooth(method=lm , color="red", se=FALSE) +
theme_ipsum()
p2

Missing data
# Libraries
library("poppr")
This is poppr version 2.9.4. To get started, type package?poppr
OMP parallel support: unavailable
library("heatmaply")
Loading required package: plotly
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
Loading required package: viridis
Loading required package: viridisLite
Registered S3 method overwritten by 'dendextend':
method from
rev.hclust vegan
Registered S3 method overwritten by 'seriation':
method from
reorder.hclust vegan
======================
Welcome to heatmaply version 1.5.0
Type citation('heatmaply') for how to cite the package.
Type ?heatmaply for the main documentation.
The github page is: https://github.com/talgalili/heatmaply/
Please submit your suggestions and bug-reports at: https://github.com/talgalili/heatmaply/issues
You may ask questions at stackoverflow, use the r and heatmaply tags:
https://stackoverflow.com/questions/tagged/heatmaply
======================
missing_data <- info_table(mydata_genind, plot = FALSE)
# Matrix format
mat <- as.matrix(missing_data)
# heatmap
p <- heatmaply(mat,
dendrogram = "none",
xlab = "", ylab = "",
main = "",
scale = "column",
margins = c(60,100,40,20),
grid_color = "white",
grid_width = 0.00001,
titleX = FALSE,
hide_colorbar = TRUE,
branches_lwd = 0.1,
label_names = c("Population", "Marker", "Value"),
fontsize_row = 8, fontsize_col = 8,
labCol = colnames(mat),
labRow = rownames(mat),
heatmap_layers = theme(axis.line=element_blank())
)
p
p
HW - Panmixia
genepop_HWtable <- HWtable_analysis(
inputFile = "data/mydata.genepop.txt",
which = "Proba",
settingsFile = "",
enumeration = FALSE,
dememorization = 10000,
batches = 20,
iterations = 5000,
verbose = interactive()
)
Error: Cannot read correctly. Check second line of input
Linkage Disequilibrium
pair.ia(mydata_genind, sample = 500, quiet = FALSE, method = 3 )
|
| | 0%
|
| | 0%
|
|== | 2%
|
|==== | 4%
Ia p.Ia rbarD p.rD
B12:C07 -0.0039 0.9421 -0.0039 0.9421
B12:D12 0.0545 0.0020 0.0547 0.0020
B12:D10 0.0204 0.0020 0.0204 0.0020
B12:A12 0.0356 0.0020 0.0356 0.0020
B12:C03 0.0531 0.0020 0.0534 0.0020
C07:D12 -0.0233 1.0000 -0.0233 1.0000
C07:D10 0.0172 0.0020 0.0172 0.0020
C07:A12 0.0364 0.0020 0.0365 0.0020
C07:C03 0.1252 0.0020 0.1254 0.0020
D12:D10 0.0708 0.0020 0.0709 0.0020
D12:A12 0.0244 0.0020 0.0245 0.0020
D12:C03 -0.0135 1.0000 -0.0135 1.0000
D10:A12 0.0170 0.0020 0.0170 0.0020
D10:C03 0.0456 0.0020 0.0458 0.0020
A12:C03 0.0284 0.0020 0.0287 0.0020

shuffle df
#shuffled_matrices <- replicate(n_rep, mat[sample(nrow(mat)), ], simplify = FALSE)
shuffled_matrices <- replicate(n_rep, mat[sample(length(mat), replace = FALSE)], simplify = FALSE)
##################
# shuffle only the genotype and add the pop column later for each matrices.
#in the loop?
###############
# Create a list to store the wc
fst_df <- numeric(sequence_length)
fis_df <- numeric(sequence_length)
# Calculate the average for each shuffled matrix
# Iterate through the shuffled matrices
for (i in 1:n_rep) {
# Calculate the statistics for the i-th matrix
#HERE THE COLUMN POP
merged_df <- cbind(level_pop, shuffled_matrices[[i]])
result_f_stats <- wc(shuffled_matrices[[i]])
result_f_stats <- as.data.frame(result_f_stats$per.loc)
# Extract FST and FIS values
fst_values <- result_f_stats$FST
fis_values <- result_f_stats$FIS
print( fst_values)
# Assign values to the data frames
fst_df <- cbind(fst_df, result_f_stats$FST)
fis_df <- cbind(fis_df, result_f_stats$FIS)
}
# Set row names as in result_f_stats
rownames(fst_df) <- rownames(fis_df) <- rownames(result_f_stats)
result_FST <- fst_df[, -1]
fis_df <-fis_df[, -1]
vec <- seq(1, n_rep)
colnames(result_FST) <- colnames(fis_df) <- vec
result_FST[1,]
count (result_f_stats[,1][1] > result_FST[1,] )
count <- sum(result_f_stats[,1][1] > result_FST[1, ])
# Initialize an empty data frame to store the counts
count_df <- data.frame(
Greater = numeric(length(result_FST)),
Smaller = numeric(length(result_FST))
)
# Compare the values in result_f_stats[1] to result_FST for each column
for (col in colnames(result_FST)) {
greater_count <- sum(result_f_stats[1] > result_FST[, col])
smaller_count <- sum(result_f_stats[1] < result_FST[, col])
count_df$Greater[col] <- greater_count
count_df$Smaller[col] <- smaller_count
}
# Print the count data frame
print(count_df)
######################## ########################
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKIyBQYXJhbWV0ZXJzIAoKYGBge3J9CmZpbHRlcmVkX2RhdGEgPC0gcmVhZC5jc3YoImRhdGEvZGF0YS0yMDIzLTA5LTExICgyKS5jc3YiLCBoZWFkZXIgPSBUUlVFKQoKc2VsZWN0ZWRfc3RhdHMgPC0gYygiSG8iLCAiSHMiLCAiSHQiLCAiRmlzIChXJkMpIiwgIkZzdCAoVyZDKSIsICJGaXMgKE5laSkiLCAiRnN0IChOZWkpIgopCgpuX3JlcD0xMAoKbl9wb3AgPSA4CgpzZXF1ZW5jZV9sZW5ndGggPC0gbGVuZ3RoKDY6MTEpIApgYGAKCgoKIyBkYXRhIGZpbHRlcmluZyBjb252ZXJ0aW9uCgpgYGB7cn0KbGlicmFyeShoaWVyZnN0YXQpCmxpYnJhcnkoYWRlZ2VuZXQpCmZpbHRlcmVkX2RhdGEgPC0gZGF0YS5mcmFtZShpbmR2ID0gcGFzdGUoc3Vic3RyKGZpbHRlcmVkX2RhdGEkUG9wdWxhdGlvbiwxLDMpLCByb3cubmFtZXMoZmlsdGVyZWRfZGF0YSksIHNlcD0iLiIpLCBmaWx0ZXJlZF9kYXRhKQojIENyZWF0ZSBteWRhdGFfZ2VuaW5kCnBvcHVsYXRpb24gPC0gZmlsdGVyZWRfZGF0YSRQb3B1bGF0aW9uCm15ZGF0YV9nZW5pbmQgPC0gZGYyZ2VuaW5kKAogIFggPSBmaWx0ZXJlZF9kYXRhWyw2OjExXSwKICBzZXAgPSAiLyIsCiAgbmNvZGUgPSA2LAogIGluZC5uYW1lcyA9IGZpbHRlcmVkX2RhdGEkaW5kdiwKICBwb3AgPSBmaWx0ZXJlZF9kYXRhJFBvcHVsYXRpb24sCiAgTkEuY2hhciA9ICIwLzAiLAogIHBsb2lkeSA9IDIsCiAgdHlwZSA9ICJjb2RvbSIsCiAgc3RyYXRhID0gTlVMTCwKICBoaWVyYXJjaHkgPSBOVUxMCikKbXlkYXRhX2dlbmluZApteWRhdGFfaGllcmZzdGF0IDwtIGdlbmluZDJoaWVyZnN0YXQobXlkYXRhX2dlbmluZCkKYGBgCgoKCiMgUnVuIGJhc2ljLnN0YXRzIGFuZCByZW5kZXIgdGhlIHJlc3VsdAoKYGBge3J9CmxpYnJhcnkocGVnYXMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGliYmxlKQoKcmVzdWx0IDwtIGJhc2ljLnN0YXRzKG15ZGF0YV9oaWVyZnN0YXQpCmRmX3Jlc3V0bF9iYXNpYzwtYXMuZGF0YS5mcmFtZShyZXN1bHQkcGVybG9jKQoKIyBXZWlyIGFuZCBDb2NrcmhhbSBlc3RpbWF0ZXMgb2YgRnN0YXRpc3RpY3MgLSBGSVMgYW5kIEZTVCAKcmVzdWx0X2Zfc3RhdHMgPC0gRnN0KGFzLmxvY2kobXlkYXRhX2dlbmluZCksIG5hLmFsbGVsZXMgPSAiIikKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHNbLDI6M10KY29sbmFtZXMocmVzdWx0X2Zfc3RhdHMpIDwtIGMoIkZzdCAoVyZDKSIsICJGaXMgKFcmQykiKQpyZXN1bHRfZl9zdGF0cyA8LSBtZXJnZShyZXN1bHRfZl9zdGF0cywgZGZfcmVzdXRsX2Jhc2ljLCBieT0icm93Lm5hbWVzIixhbGwueD1UUlVFKQpjb2xuYW1lcyhyZXN1bHRfZl9zdGF0cylbMTBdIDwtICJGc3QgKE5laSkiCmNvbG5hbWVzKHJlc3VsdF9mX3N0YXRzKVsxMl0gPC0gIkZpcyAoTmVpKSIKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIGNvbHVtbl90b19yb3duYW1lcyguLCB2YXIgPSAnUm93Lm5hbWVzJykKcmVzdWx0X2Zfc3RhdHNfc2VsZWMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIHNlbGVjdChhbGxfb2Yoc2VsZWN0ZWRfc3RhdHMpKQpyZXN1bHRfZl9zdGF0c19zZWxlYwpgYGAKCiMgRy1zdGF0aXN0aWMKCmBgYHtyfQpsaWJyYXJ5KGhyYnJ0aGVtZXMpCmxpYnJhcnkoZ2dwbG90MikKCiMgY29tcHV0ZSB0aGUgR3N0YXRzCnJlc3VsdF9mX3N0YXRzIDwtIHJlc3VsdF9mX3N0YXRzICU+JSBtdXRhdGUoR1NUID0gMS1Icy9IdCkKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIG11dGF0ZSgiR1NUJyciID0gKG5fcG9wKihIdC1IcykpLygobl9wb3AqSHMtSHQpKigxLUhzKSkpCnJlc3VsdF9mX3N0YXRzCgojIFBsb3Qgd2l0aCBsaW5lYXIgdHJlbmQKcDIgPC0gZ2dwbG90KHJlc3VsdF9mX3N0YXRzLCBhZXMoeD1HU1QsIHk9SHMpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0icmVkIiwgc2U9RkFMU0UpICsKICB0aGVtZV9pcHN1bSgpCnAyCgpgYGAKCiMgTWlzc2luZyBkYXRhCgpgYGB7cn0KIyBMaWJyYXJpZXMKbGlicmFyeSgicG9wcHIiKQpsaWJyYXJ5KCJoZWF0bWFwbHkiKQoKbWlzc2luZ19kYXRhIDwtIGluZm9fdGFibGUobXlkYXRhX2dlbmluZCwgcGxvdCA9IEZBTFNFKQoKIyBNYXRyaXggZm9ybWF0Cm1hdCA8LSBhcy5tYXRyaXgobWlzc2luZ19kYXRhKQojIGhlYXRtYXAKcCA8LSBoZWF0bWFwbHkobWF0LCAKICAgICAgICAgICAgICAgZGVuZHJvZ3JhbSA9ICJub25lIiwKICAgICAgICAgICAgICAgeGxhYiA9ICIiLCB5bGFiID0gIiIsIAogICAgICAgICAgICAgICBtYWluID0gIiIsCiAgICAgICAgICAgICAgIHNjYWxlID0gImNvbHVtbiIsCiAgICAgICAgICAgICAgIG1hcmdpbnMgPSBjKDYwLDEwMCw0MCwyMCksCiAgICAgICAgICAgICAgIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICBncmlkX3dpZHRoID0gMC4wMDAwMSwKICAgICAgICAgICAgICAgdGl0bGVYID0gRkFMU0UsCiAgICAgICAgICAgICAgIGhpZGVfY29sb3JiYXIgPSBUUlVFLAogICAgICAgICAgICAgICBicmFuY2hlc19sd2QgPSAwLjEsCiAgICAgICAgICAgICAgIGxhYmVsX25hbWVzID0gYygiUG9wdWxhdGlvbiIsICJNYXJrZXIiLCAiVmFsdWUiKSwKICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gOCwgZm9udHNpemVfY29sID0gOCwKICAgICAgICAgICAgICAgbGFiQ29sID0gY29sbmFtZXMobWF0KSwKICAgICAgICAgICAgICAgbGFiUm93ID0gcm93bmFtZXMobWF0KSwKICAgICAgICAgICAgICAgaGVhdG1hcF9sYXllcnMgPSB0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQopCnAKYGBgCgoKCiMgSFcgLSBQYW5taXhpYQoKYGBge3J9CgoKbGlicmFyeSgicGVnYXMiKQoKaHcudGVzdChhcy5sb2NpKG15ZGF0YV9nZW5pbmQpLCBCID0gMTAwMCkKCgpsaWJyYXJ5KGdlbmVwb3ApCiNodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZ2VuZXBvcC9nZW5lcG9wLnBkZgpnZW5lcG9wX0hXIDwtIHRlc3RfSFcoCiAgaW5wdXRGaWxlID0gImRhdGEvbXlkYXRhLmdlbmVwb3AudHh0IiwKICB3aGljaCA9ICJQcm9iYSIsCiAgb3V0cHV0RmlsZSA9ICIiLAogIHNldHRpbmdzRmlsZSA9ICIiLAogIGVudW1lcmF0aW9uID0gRkFMU0UsCiAgZGVtZW1vcml6YXRpb24gPSAxMDAwMCwKICBiYXRjaGVzID0gMjAsCiAgaXRlcmF0aW9ucyA9IDUwMDAsCiAgdmVyYm9zZSA9IGludGVyYWN0aXZlKCkKKQoKZ2VuZXBvcF9IV3RhYmxlIDwtIEhXdGFibGVfYW5hbHlzaXMoCiAgaW5wdXRGaWxlID0gImRhdGEvbXlkYXRhLmdlbmVwb3AudHh0IiwKICB3aGljaCA9ICJQcm9iYSIsCiAgc2V0dGluZ3NGaWxlID0gIiIsCiAgZW51bWVyYXRpb24gPSBGQUxTRSwKICBkZW1lbW9yaXphdGlvbiA9IDEwMDAwLAogIGJhdGNoZXMgPSAyMCwKICBpdGVyYXRpb25zID0gNTAwMCwKICB2ZXJib3NlID0gaW50ZXJhY3RpdmUoKQopCmBgYAoKCgojIExpbmthZ2UgRGlzZXF1aWxpYnJpdW0KCmBgYHtyfQoKTEQoYXMubG9jaShteWRhdGFfZ2VuaW5kJHRhYiksIGxvY3VzID0gYygxLCAyKSwgZGV0YWlscyA9IFRSVUUpCgphPC1MRHNjYW4oYXMubG9jaShteWRhdGFfaGllcmZzdGF0WywyOjddKSkKCkxEbWFwKGEpCgoKaGVhZChteWRhdGFfaGllcmZzdGF0WywyOjddKQoKCmxpYnJhcnkocmFkaWF0b3IpCiNodHRwczovL3RoaWVycnlnb3NzZWxpbi5naXRodWIuaW8vcmFkaWF0b3IvcmVmZXJlbmNlL2dlbm9taWNfY29udmVydGVyLmh0bWwKI2h0dHBzOi8vdGhpZXJyeWdvc3NlbGluLmdpdGh1Yi5pby9yYWRpYXRvci9hcnRpY2xlcy9yYWRfZ2Vub21pY3NfY29tcHV0ZXJfc2V0dXAuaHRtbAoKbXlkYXRhMSA8LSBnZW5vbWljX2NvbnZlcnRlcihteWRhdGFfZ2VuaW5kLCBwYXJhbGxlbC5jb3JlID0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkgLSAxLCBvdXRwdXQgPSAiZ2VuZXBvcCIsIGZpbGVuYW1lID0gIi4uL2RhdGEvbXlkYXRhLmdlbmVwb3AudHh0IikKbXlkYXRhMSA8LSB0aWR5X2dlbmluZChteWRhdGFfZ2VuaW5kLCB0aWR5ID0gVFJVRSwgd3JpdGUgPSBGQUxTRSwgdmVyYm9zZSA9IFRSVUUpCgpkZXRlY3RfYWxsX21pc3NpbmcoKQoKCmxpYnJhcnkoZ2VuZXBvcCkKCgp0ZXN0X0xEKAogIGlucHV0RmlsZSA9ICJkYXRhL215ZGF0YS5nZW5lcG9wLnR4dCIsCiAgb3V0cHV0RmlsZSA9ICIiLAogIHNldHRpbmdzRmlsZSA9ICIiLAogIGRlbWVtb3JpemF0aW9uID0gMTAwMDAsCiAgYmF0Y2hlcyA9IDEwMCwKICBpdGVyYXRpb25zID0gNTAwMCwKICB2ZXJib3NlID0gaW50ZXJhY3RpdmUoKQopCgojRnN0KAojICBpbnB1dEZpbGUgPSAiZGF0YS9teWRhdGEuZ2VuZXBvcC50eHQiLAojICBzaXplcyA9IEZBTFNFLAojICBwYWlycyA9IEZBTFNFLAojICBvdXRwdXRGaWxlID0gIiIsCiMgIGRhdGFUeXBlID0gIkRpcGxvaWQiLAojICB2ZXJib3NlID0gaW50ZXJhY3RpdmUoKQojKQoKbGlicmFyeSgicG9wcHIiKSAKcGFpci5pYShteWRhdGFfZ2VuaW5kLCBzYW1wbGUgPSA1MDAsIHF1aWV0ID0gRkFMU0UsIG1ldGhvZCA9IDMgKQojIHdvcmtpbmcgYnV0IGRpZmZlcmVudCB2YWx1ZXMKCmBgYAoKCiMgc2h1ZmZsZSBkZgoKYGBge3J9Cgojc2h1ZmZsZWRfbWF0cmljZXMgPC0gcmVwbGljYXRlKG5fcmVwLCBtYXRbc2FtcGxlKG5yb3cobWF0KSksIF0sIHNpbXBsaWZ5ID0gRkFMU0UpCnNodWZmbGVkX21hdHJpY2VzIDwtIHJlcGxpY2F0ZShuX3JlcCwgbWF0W3NhbXBsZShsZW5ndGgobWF0KSwgcmVwbGFjZSA9IEZBTFNFKV0sIHNpbXBsaWZ5ID0gRkFMU0UpCiMjIyMjIyMjIyMjIyMjIyMjIwojIHNodWZmbGUgb25seSB0aGUgZ2Vub3R5cGUgYW5kIGFkZCB0aGUgcG9wIGNvbHVtbiBsYXRlciBmb3IgZWFjaCBtYXRyaWNlcy4gCiNpbiB0aGUgbG9vcD8gCiMjIyMjIyMjIyMjIyMjIwoKCiMgQ3JlYXRlIGEgbGlzdCB0byBzdG9yZSB0aGUgd2MKZnN0X2RmIDwtIG51bWVyaWMoc2VxdWVuY2VfbGVuZ3RoKQpmaXNfZGYgPC0gbnVtZXJpYyhzZXF1ZW5jZV9sZW5ndGgpCgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBmb3IgZWFjaCBzaHVmZmxlZCBtYXRyaXgKCiMgSXRlcmF0ZSB0aHJvdWdoIHRoZSBzaHVmZmxlZCBtYXRyaWNlcwpmb3IgKGkgaW4gMTpuX3JlcCkgewogICMgQ2FsY3VsYXRlIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgaS10aCBtYXRyaXgKICAjSEVSRSBUSEUgQ09MVU1OIFBPUAogIG1lcmdlZF9kZiA8LSBjYmluZChsZXZlbF9wb3AsIHNodWZmbGVkX21hdHJpY2VzW1tpXV0pCiAgcmVzdWx0X2Zfc3RhdHMgPC0gd2Moc2h1ZmZsZWRfbWF0cmljZXNbW2ldXSkgCiAgcmVzdWx0X2Zfc3RhdHMgPC0gYXMuZGF0YS5mcmFtZShyZXN1bHRfZl9zdGF0cyRwZXIubG9jKQogICMgRXh0cmFjdCBGU1QgYW5kIEZJUyB2YWx1ZXMKICBmc3RfdmFsdWVzIDwtIHJlc3VsdF9mX3N0YXRzJEZTVAogIGZpc192YWx1ZXMgPC0gcmVzdWx0X2Zfc3RhdHMkRklTCiAgcHJpbnQoIGZzdF92YWx1ZXMpCiAgIyBBc3NpZ24gdmFsdWVzIHRvIHRoZSBkYXRhIGZyYW1lcwogIGZzdF9kZiA8LSBjYmluZChmc3RfZGYsIHJlc3VsdF9mX3N0YXRzJEZTVCkKICBmaXNfZGYgPC0gY2JpbmQoZmlzX2RmLCByZXN1bHRfZl9zdGF0cyRGSVMpCn0KCiMgU2V0IHJvdyBuYW1lcyBhcyBpbiByZXN1bHRfZl9zdGF0cwoKcm93bmFtZXMoZnN0X2RmKSA8LSByb3duYW1lcyhmaXNfZGYpIDwtIHJvd25hbWVzKHJlc3VsdF9mX3N0YXRzKQpyZXN1bHRfRlNUIDwtIGZzdF9kZlssIC0xXQpmaXNfZGYgPC1maXNfZGZbLCAtMV0KdmVjIDwtIHNlcSgxLCBuX3JlcCkKY29sbmFtZXMocmVzdWx0X0ZTVCkgPC0gY29sbmFtZXMoZmlzX2RmKSA8LSB2ZWMKCgpyZXN1bHRfRlNUWzEsXSAKCmNvdW50IChyZXN1bHRfZl9zdGF0c1ssMV1bMV0gPiByZXN1bHRfRlNUWzEsXSApCmNvdW50IDwtIHN1bShyZXN1bHRfZl9zdGF0c1ssMV1bMV0gPiByZXN1bHRfRlNUWzEsIF0pCgoKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSBjb3VudHMKY291bnRfZGYgPC0gZGF0YS5mcmFtZSgKICBHcmVhdGVyID0gbnVtZXJpYyhsZW5ndGgocmVzdWx0X0ZTVCkpLAogIFNtYWxsZXIgPSBudW1lcmljKGxlbmd0aChyZXN1bHRfRlNUKSkKKQoKIyBDb21wYXJlIHRoZSB2YWx1ZXMgaW4gcmVzdWx0X2Zfc3RhdHNbMV0gdG8gcmVzdWx0X0ZTVCBmb3IgZWFjaCBjb2x1bW4KZm9yIChjb2wgaW4gY29sbmFtZXMocmVzdWx0X0ZTVCkpIHsKICBncmVhdGVyX2NvdW50IDwtIHN1bShyZXN1bHRfZl9zdGF0c1sxXSA+IHJlc3VsdF9GU1RbLCBjb2xdKQogIHNtYWxsZXJfY291bnQgPC0gc3VtKHJlc3VsdF9mX3N0YXRzWzFdIDwgcmVzdWx0X0ZTVFssIGNvbF0pCiAgY291bnRfZGYkR3JlYXRlcltjb2xdIDwtIGdyZWF0ZXJfY291bnQKICBjb3VudF9kZiRTbWFsbGVyW2NvbF0gPC0gc21hbGxlcl9jb3VudAp9CgojIFByaW50IHRoZSBjb3VudCBkYXRhIGZyYW1lCnByaW50KGNvdW50X2RmKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKCmBgYAoKCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAoKIwoKYGBge3J9CgoKYGBgCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAoKIwoKYGBge3J9CgoKYGBgCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAo=